#ifndef __ZONE_H__
#define __ZONE_H__


#define ALLOCATE(_)		Get_Global_Zone()->alloc(Get_Global_Zone(), (_))
#define DEALLOCATE(_)	Get_Global_Zone()->dealloc(Get_Global_Zone(), (_))

/* zone allocator */
typedef struct zhead_s
{
	struct	zhead_s	*prev, *next;
	short	magic;
	short	tag;	// for group free
	int		size;
} zhead_t;

typedef struct zone_t zone_t;
struct zone_t
{
	zhead_t* z_chain;
	int z_count, z_bytes;
	void*(*alloc)(zone_t*, int);
	void (*dealloc)(zone_t*, void*);
	void*(*tag_alloc)(zone_t*, int, int);
	void (*tag_dealloc)(zone_t*, int);
	void (*status)(zone_t*);
};


/* sigleton object */
static zone_t* global_zone;

zone_t* Get_Global_Zone(void);
void	Drop_Global_Zone(void);

void Z_Free(zone_t*, void*);
void* Z_Malloc(zone_t*, int);
void Z_Stats_f(zone_t*);


#endif